home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacTech 1 to 12
/
MacTech-vol-1-12.toast
/
Reference
/
the cmsp digests ('94-'97)
/
csmp digest Vol 3 No 020
< prev
next >
Wrap
Internet Message Format
|
1997-05-06
|
104KB
From: pottier@clipper.ens.fr (Francois Pottier)
Subject: csmp-digest-v3-020
Date: Wed, 27 Apr 94 17:01:22 MET DST
C.S.M.P. Digest Wed, 27 Apr 94 Volume 3 : Issue 20
Today's Topics:
Can background app Paste?
Determing selected-chosen printer
Drawing text vertically...
HELP! Sending apple events
How can I LOCK in a code segment ?
INIT vs. Background Only App.
Info on Graphics Animation Programming?
Launching an application from a program...
Looking for a Windows-Mac portable GUI toolkit or builder
PowerPC Anti-Aliased Text
SubLaunching applications and DA's
System 7 Menu on right side of menubar
free vs. DisposPtr??
The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
(pottier@clipper.ens.fr).
The digest is a collection of article threads from the internet newsgroup
comp.sys.mac.programmer. It is designed for people who read c.s.m.p. semi-
regularly and want an archive of the discussions. If you don't know what a
newsgroup is, you probably don't have access to it. Ask your systems
administrator(s) for details. If you don't have access to news, you may
still be able to post messages to the group by using a mail server like
anon.penet.fi (mail help@anon.penet.fi for more information).
Each issue of the digest contains one or more sets of articles (called
threads), with each set corresponding to a 'discussion' of a particular
subject. The articles are not edited; all articles included in this digest
are in their original posted form (as received by our news server at
nef.ens.fr). Article threads are not added to the digest until the last
article added to the thread is at least two weeks old (this is to ensure that
the thread is dead before adding it to the digest). Article threads that
consist of only one message are generally not included in the digest.
The digest is officially distributed by two means, by email and ftp.
If you want to receive the digest by mail, send email to listserv@ens.fr
with no subject and one of the following commands as body:
help Sends you a summary of commands
subscribe csmp-digest Your Name Adds you to the mailing list
signoff csmp-digest Removes you from the list
Once you have subscribed, you will automatically receive each new
issue as it is created.
The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
Questions related to the ftp site should be directed to
scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
digest are available there.
Also, the digests are available to WAIS users as comp.sys.mac.programmer.src.
-------------------------------------------------------
>From west@augsburg.edu (James West)
Subject: Can background app Paste?
Date: 12 Apr 1994 19:46:30 GMT
Organization: Augsburg College
Can any kind soul tell me if it is possible to have a background only
application paste to the clipboard?
The application is triggered by appleevents and I would like to have it
place an image on the scrap before it returns. This works fine if I bring
it to the front, but in the background it either completes without pasting
anything, or crashes me into macsbug.
I have looked at a lot of stuff but have not yet found anything that
explicitly tells me that this can't be done with a background app.
Perhaps a resumeevent posting to the event queue...
Any help would be greatly appreciated.
--
James West ***** I like Cacti... ****
Augsburg College Graphic Center
731 21st Ave S
Mpls. MN 55454
west@augsburg.edu ******** OUTCH!! ********
+++++++++++++++++++++++++++
>From Dave Falkenburg <falken@apple.com>
Date: Wed, 13 Apr 1994 17:19:53 GMT
Organization: Apple Computer, Inc.
In article <west-120494144037@141.224.192.172> James West,
west@augsburg.edu writes:
>Can any kind soul tell me if it is possible to have a background only
>application paste to the clipboard?
Nope. You don't want to know why...
A future rev of the scrap manager MAY provide a way to do this, but the
current limitations on the scrap manager prevent it from working when
called from the background.
-Dave Falkenburg
-Apple Computer, Inc.
---------------------------
>From DAVISM@kcgl1.eng.ohio-state.edu (Mike Davis, Chief of Operations -- KCGL)
Subject: Determing selected-chosen printer
Date: 5 Apr 1994 17:01:39 GMT
Organization: The Ohio State University
I have checked a number of texts and also examined the STR resources
for System, Chooser and a printer driver... Where is the information stored
as to which printer has been selected under the Chooser? I know the name of
the Printing Manager Resource File (PMRF) is stored in the System file in
STR resource -8192, but I couldn't find anything which resembled the name of
the actual chosen printer.
Thanks,
Mike
--
Internet: davism@KCGL1.eng.ohio-state.edu |
-or- DAVISM+@osu.edu | These Thoughts, They Be Mine
BITNET: DAVISM+@OHSTMAIL.BITNET |
+++++++++++++++++++++++++++
>From Ben Rubinstein <benr@cogapp.demon.co.uk>
Date: Tue, 5 Apr 1994 18:40:45 GMT
Organization: Cognitive Applications, Brighton, England
In article <2ns5hj$fj8@charm.magnus.acs.ohio-state.edu> Mike Davis,
DAVISM@kcgl1.eng.ohio-state.edu writes:
>Where is the information stored as to which printer has been selected
under
>the Chooser? I know the name of the Printing Manager Resource File
(PMRF)
>is stored in the System file in STR resource -8192...
'STR ' resource ID -8192 in System has name of currently selected driver.
'PAPA' resource -8192 in the driver has name of current printer (pascal
string at front
of resource).
I have an old XFCn to return the name of the current printer which works
at least in our environment (networked LaserWriters) - can't guarantee
how it will go with stylewriters, et al. It has the following perhaps
slightly worrying comment at the top: "We cheat by just doing "PrOpen",
hoping that this will ensure the current driver is open as a res file,
and then looking for Papa (point is to avoid worrying about where the
driver is in system 6/7)"
In fact, it's very short - so here it is:
- --
#define PRNAMETYPE 'PAPA'
#define PRNAMEID -8192
PrOpen();
if (PrError() != noErr) { ....return error stuff... }
if (hRsrc = GetResource(PRNAMETYPE, PRNAMEID)) {
HLock(hRsrc);
paramPtr->returnValue = PasToZero(paramPtr, (StringPtr) *(hRsrc));
HUnlock(hRsrc);
ReleaseResource(hRsrc);
} else {
....return error stuff...
}
PrClose();
- ---
As I say, I make no warranties about it, but it's never given me
trouble...
Ben
+++++++++++++++++++++++++++
>From mgr@aggroup.aggroup.com (Mike Russell)
Date: Tue, 05 Apr 1994 11:58:17 -0800
Organization: the ag group, inc.
In article <2ns5hj$fj8@charm.magnus.acs.ohio-state.edu>,
DAVISM@kcgl1.eng.ohio-state.edu (Mike Davis, Chief of Operations -- KCGL)
wrote:
>
> I have checked a number of texts and also examined the STR resources
> for System, Chooser and a printer driver... Where is the information stored
> as to which printer has been selected under the Chooser? I know the name of
It's in the PMRF in PAPA resource -8192 for LaserWriter and LaserWriter 8.
This info is for use by the driver and is not stricly part of the
interface.
+++++++++++++++++++++++++++
>From chewey@aol.com (Chewey)
Date: 6 Apr 1994 09:46:04 -0400
Organization: America Online, Inc. (1-800-827-6364)
For System 7.x the System resource file contains an'alis' resource (ID -8192)
to the currently selected output device. You can get this resource handle and
use it in a call to ResolveAlias(). You'll get an FSSpec record to the actual
output driver.
Hope this helps,
-Chewey
- --------------
Matthew E. Axsom
Mac Software Engineer
Mac/PC Connection, Inc.
All opinions are mine, and not those of Mac/PC Connection, Inc. (bla, bla,
bla).
+++++++++++++++++++++++++++
>From Manuel Veloso <veloso@netcom.com>
Date: Wed, 6 Apr 1994 23:23:51 GMT
Organization: Ibex Productions
In article <2ns5hj$fj8@charm.magnus.acs.ohio-state.edu> Mike Davis,
DAVISM@kcgl1.eng.ohio-state.edu writes:
>the Printing Manager Resource File (PMRF) is stored in the System file in
>STR resource -8192, but I couldn't find anything which resembled the name of
>the actual chosen printer.
Along with the rest of the info in the previous post, be warned that there's
an alias to the currently selected printer driver resident in the system
file (I think it's 'alis' 0). I'm not sure if it's still there, but it was
in 7.0 (the last time I looked).
+++++++++++++++++++++++++++
>From dowdy@apple.com (Tom Dowdy)
Date: Wed, 13 Apr 1994 23:45:09 GMT
Organization: Apple Computer, Inc.
In article <netnewsCnv2Br.87L@netcom.com>, Manuel Veloso
<veloso@netcom.com> wrote:
> In article <2ns5hj$fj8@charm.magnus.acs.ohio-state.edu> Mike Davis,
> DAVISM@kcgl1.eng.ohio-state.edu writes:
> >the Printing Manager Resource File (PMRF) is stored in the System file in
> >STR resource -8192, but I couldn't find anything which resembled the name of
> >the actual chosen printer.
>
> Along with the rest of the info in the previous post, be warned that there's
> an alias to the currently selected printer driver resident in the system
> file (I think it's 'alis' 0). I'm not sure if it's still there, but it was
> in 7.0 (the last time I looked).
Be warned that all of the above is undocumented and subject to change.
If you rely on this information your application will break.
But you may say, when will this breaking happen? QuickDraw GX -- I
*promise* that these methods of hacking around will *not* work.
--
Tom Dowdy Internet: dowdy@apple.COM
Apple Computer MS:302-3KS UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
1 Infinite Loop AppleLink: DOWDY1
Cupertino, CA 95014
"The 'Ooh-Ah' Bird is so called because it lays square eggs."
---------------------------
>From pcw@access1.digex.net (Peter Wayner)
Subject: Drawing text vertically...
Date: 5 Apr 1994 15:31:01 -0400
Organization: Express Access Online Communications, Greenbelt, MD USA
I would like to draw text vertically. Does anyone have
any code samples for how to do this? I'm presuming
that I'll have to copy it and swap the x and y's.
But does anyone have a definite "good" way to do it?
Thanks a BNDL...
Peter Wayner
+++++++++++++++++++++++++++
>From ewies@athena.mit.edu (Evan Wies)
Date: 10 Apr 1994 20:35:28 GMT
Organization: Massachvsetts Institvte of Technology
In article <pcw.765574161@access1>
pcw@access1.digex.net (Peter Wayner) writes:
> I would like to draw text vertically. Does anyone have
> any code samples for how to do this? I'm presuming
> that I'll have to copy it and swap the x and y's.
> But does anyone have a definite "good" way to do it?
>
> Thanks a BNDL...
>
> Peter Wayner
When you say "draw text vertically" do you mean like this:
D
E
A
T
H
or do you mean that you want to display a string that is rotated 90
degrees?
I have done the latter... I made a rotated-font with Fontographer and
then wrote a routine that would display it. It doesn't look very pretty
because fonts weren't designed to be displayed in that orientation; the
spacing is irregular. It fit my needs though...
I can give you the source and make a font for you, if that's what you
need...
-Evan Wies
+++++++++++++++++++++++++++
>From dowdy@apple.com (Tom Dowdy)
Date: Mon, 11 Apr 1994 17:56:37 GMT
Organization: Apple Computer, Inc.
In article <pcw.765574161@access1>, pcw@access1.digex.net (Peter Wayner)
wrote:
> I would like to draw text vertically. Does anyone have
> any code samples for how to do this? I'm presuming
> that I'll have to copy it and swap the x and y's.
> But does anyone have a definite "good" way to do it?
There are Snippets on the various developer CDs that show
how to perform 90 degree rotation of bitmaps, which is
basically what you need to do in order to draw rotated
text.
- OR -
Using QuickDraw GX:
myShape = GXNewText(3, "Hi!", nil);
GXRotateShape(myShape, ff(90), 0, 0);
GXDrawShape(myShape);
GXDisposeShape(myShape);
--
Tom Dowdy Internet: dowdy@apple.COM
Apple Computer MS:302-3KS UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
1 Infinite Loop AppleLink: DOWDY1
Cupertino, CA 95014
"The 'Ooh-Ah' Bird is so called because it lays square eggs."
+++++++++++++++++++++++++++
>From opstad@apple.com (David Opstad)
Date: 11 Apr 1994 16:12:36 -0700
Organization: Apple Computer Inc, Cupertino, CA
In article <dowdy-110494105244@17.202.72.12>,
Tom Dowdy <dowdy@apple.com> wrote:
>
>Using QuickDraw GX:
> myShape = GXNewText(3, "Hi!", nil);
> GXRotateShape(myShape, ff(90), 0, 0);
> GXDrawShape(myShape);
> GXDisposeShape(myShape);
Actually, Tom left out the other kind of vertical text. If you want the
letters themselves to remain upright after the shape is rotated, add the
following line before the GXDrawShape call:
GXSetShapeTextAttributes(myShape, GXGetShapeTextAttributes(myShape)
| gxVerticalText);
Dave Opstad
GX Line Layout Weenie
+++++++++++++++++++++++++++
>From Philippe.Casgrain@univ-rennes1.fr (Philippe Casgrain)
Date: Tue, 12 Apr 1994 15:47:31 +0100
Organization: Universite de Rennes-1, Fac. de medecine dentaire
For all the good folks that want to draw rotated text and do not have
QuickDraw GX, may I suggest:
-r 34176 Oct 3 1992 ./mac/sc/snippets/imaging/graphics/rotatestring.hqx
on ftp.apple.com. It contains a (small) library and THINK Pascal/C source
code. It worked great for me, the first time I tried it.
Philippe
--
Philippe.Casgrain@univ-rennes1.fr
Mac Hacker Lite
+++++++++++++++++++++++++++
>From roderis@CSOS.ORST.EDU (Stephen Roderick)
Date: 12 Apr 1994 15:30:00 GMT
Organization: CS Outreach Services, Oregon State University, Corvallis, OR, USA
In article <dowdy-110494105244@17.202.72.12>,
Tom Dowdy <dowdy@apple.com> wrote:
>In article <pcw.765574161@access1>, pcw@access1.digex.net (Peter Wayner)
>wrote:
>
>> I would like to draw text vertically. Does anyone have
>> any code samples for how to do this? I'm presuming
>
>There are Snippets on the various developer CDs that show
>how to perform 90 degree rotation of bitmaps, which is
>basically what you need to do in order to draw rotated
>text.
>
>--
> Tom Dowdy Internet: dowdy@apple.COM
> Apple Computer MS:302-3KS UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
> 1 Infinite Loop AppleLink: DOWDY1
The Apple snippet is buggy. I have a working version which I can
send to anyone who wants it.
--
- ---------------------------------------------------------
Stephen Roderick
roderis@kira.csos.orst.edu
- ---------------------------------------------------------
+++++++++++++++++++++++++++
>From dowdy@apple.com (Tom Dowdy)
Date: Tue, 12 Apr 1994 02:46:37 GMT
Organization: Apple Computer, Inc.
In article <2oclh5$10a@apple.com>, opstad@apple.com (David Opstad) wrote:
> In article <dowdy-110494105244@17.202.72.12>,
> Tom Dowdy <dowdy@apple.com> wrote:
> >
> >Using QuickDraw GX:
> > myShape = GXNewText(3, "Hi!", nil);
> > GXRotateShape(myShape, ff(90), 0, 0);
> > GXDrawShape(myShape);
> > GXDisposeShape(myShape);
>
> Actually, Tom left out the other kind of vertical text. If you want the
> letters themselves to remain upright after the shape is rotated, add the
> following line before the GXDrawShape call:
>
> GXSetShapeTextAttributes(myShape, GXGetShapeTextAttributes(myShape)
> | gxVerticalText);
Of course, but this isn't the kind of "rotated text" folks are always
asking for. :-)
Dave also forgot to point out that this shape attribute will also
work properly with languages that are normally vertical -- allowing
you to mix roman and kanji text (as an example) and have the
proper sections of the text adjust properly.
> Dave Opstad
> GX Line Layout Weenie
And Dave is *really* supposed to be relaxing on his sabatical right
now :-)
--
Tom Dowdy Internet: dowdy@apple.COM
Apple Computer MS:302-3KS UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
1 Infinite Loop AppleLink: DOWDY1
Cupertino, CA 95014
"The 'Ooh-Ah' Bird is so called because it lays square eggs."
---------------------------
>From ericg@cs.uoregon.edu (Mystery Man)
Subject: HELP! Sending apple events
Date: 12 Apr 1994 17:57:10 -0700
Organization: University of Oregon Computer and Information Sciences Dept.
I need some help with getting the proper information for the AEAddressDesc
field in the AECreateAppleEvent procedure.
What I would like to be able to do it select another application on another
macintosh hooked up to the local network or an application on the MAC that my
program is running on.
>From what I understand, the PPCBrowser function will allow me to do this.
For some reason, I can't seem to give it the correct parameters.
Here is what I have tried:
(Everything compiles just fine, but myErr = -50 when I run this code)
I am certain that I am including all of the proper header files, etc..
I am running THINK C 6.01 on a IIsi.
void FindTheApplication( void )
{
OSErr myErr;
Str255 theNullString = "\p";
Str255 questionString = "\pPlease select the application";
myErr = PPCBrowser( questionString,
theNullString,
FALSE,
&(theTargetID.location),
theLocation,
nil,
"\p" );
fprintf( cp, "The Error %d\n", myErr );
}
I would appreciate any and all help. With this and the contortions I need to
then go through to get this information into an AEAddressDesc type.
thanx..!
===Eric Gorr================ericg@cs.uoregon.edu===========aka MystryMan===
_____
|\ /| * Invincibility is in oneself, vulnerability is in the opponent
| O | * Therefore the considerations of the intelligent always include both
|/_\| benefit and harm (Sun Tzu)
#include <standard.disclamer>
=====Insults, like violence, are the last resort of the incompetent...=====
+++++++++++++++++++++++++++
>From cassidy@esd55.enet.dec.com (Charlie Cassidy)
Date: 13 Apr 1994 18:37:34 GMT
Organization: Digital Equipment Corporation
In article <2ofg16$c08@comix.cs.uoregon.edu>, ericg@cs.uoregon.edu (Mystery Man) writes:
|>
|>void FindTheApplication( void )
|>{
|> OSErr myErr;
|> Str255 theNullString = "\p";
|> Str255 questionString = "\pPlease select the application";
|>
|> myErr = PPCBrowser( questionString,
|> theNullString,
|> FALSE,
|> &(theTargetID.location),
|> theLocation,
|> nil,
|> "\p" );
|>
|> fprintf( cp, "The Error %d\n", myErr );
|>
|>}
|>
Eric,
The problem looks to be the theLocation parameter. Pass the address
&theLocation (unless of course it is already a pointer).
Here is a code snippet that illustrates the process from PPCBrowser to SendAE.
It is translated from Pascal code that I pieced together from AboutThatMac.
#include <EPPC.h>
#include <PPCToolbox.h>
#include <AppleEvents.h>
// define kMyAEClass and kMyAEID here
void main()
{
AppleEvent theAE, theReply;
AEDescList myAEDescList ;
AEAddressDesc targetAddress ;
TargetID toTargetID ;
PortInfoRec myPortInfo ;
OSType theParam;
Str255 gPrompt = "\pFoo";
Str255 gAppStr = "\pBar";
OSErr theResult;
theResult = PPCBrowser(gPrompt, gAppStr, 0, &toTargetID.location, &myPortInfo,
nil, "\p");
toTargetID.name = myPortInfo.name;
// I cheated and hardcoded the size of toTargetID
theResult = AECreateDesc(typeTargetID, &toTargetID, 252,
&targetAddress);
theResult = AECreateAppleEvent(kMyAEClass, kMyAEID, &targetAddress,
kAutoGenerateReturnID, kAnyTransactionID,&theAE);
theResult = AECreateList(NULL, 0, 0, &myAEDescList);
// use AEPutPtr here to add parameters to the AEDescList
theResult = AEPutParamDesc(&theAE, keyDirectObject, &myAEDescList);
theResult = AEDisposeDesc(&myAEDescList);
// another cheat, hardcoding the timeout value
theResult = AESend(&theAE, &theReply, kAEWaitReply + kAENeverInteract,
kAENormalPriority, 240, NULL, NULL);
theResult = AEDisposeDesc(&theAE);
theResult = AEDisposeDesc(&targetAddress);
}
/* End. */
--
=============================================================================
"Good things can happen, and frequently do, to people as brainy and footsy
as you." - Dr. Seuss
=============================================================================
Charlie Cassidy Internet: cassidy@elwood.enet.dec.com
Digital Equipment Corporation Amateur Radio: charlie@n1hlr.ampr.org
SSD Engineering - SHR1-3/H28
333 South Street This posting reflects the opinion of
Shrewsbury, MA 01545 the author, not Digital Equipment Corp
=============================================================================
---------------------------
>From louis@asterix.drev.dnd.ca (Louis Demers)
Subject: How can I LOCK in a code segment ?
Date: 7 Apr 1994 16:48:41 -0400
Organization: Defence Research Establishment Valcartier
Hi,
We are developping an application with MacApp 3.0.1,
MPW C++. Part of the code uses functions pointers that
are initialized at the beginning of the Application. Later
when we use those function pointers, we crash because
the code segment containing the function's code has been
moved and the pointers are not pointing to the new location.
What we would like to do is lock the proper code segment
at the beginning so that our function pointers remain valid.
This brings us to the more general consideration:
" How can function pointers (in C) be reliably used in
an environment where code can be relocated without
notice ? "
Thanks in advance...
Louis
PS: The code really needs function pointers, we can't realistically
change the way this part of the code is written.
--
| Louis Demers | DREV, Defence Research Establishment,Valcartier |
| louis@asterix.drev.dnd.ca | POBox 8800, Courcelette,Quebec, CANADA, G0A 1R0 |
| (131.132.48.2) | Office: (418) 844-4424 fax (418) 844-4511 |
+---------------------------+-------------------------------------------------+
+++++++++++++++++++++++++++
>From Willie Rauchwerger <willie-rauchwerger@uokhsc.edu>
Date: 7 Apr 1994 22:43:25 GMT
Organization: OU Health Sciences Center
In article <2o1rj9$4gb@asterix.drev.dnd.ca> Louis Demers,
louis@asterix.drev.dnd.ca writes:
> " How can function pointers (in C) be reliably used in
> an environment where code can be relocated without
> notice ? "
I would check your implementation of Function pointers. If I recall
right (Check New Inside Macintosh: Memory or was that Volume 6),
function pointers should remain valid throughout the execution time of
your software.
If the segment is unloaded, I believe the jump table for the application
correctly loads the segment so that your function pointer is valid.
I don't know if this is a correct explanation, but its behavior (ie you
won't crash if a function pointer to a function in an unloaded segment) is
true.
If this were not the case, people who have custom dialog filters, apple
event handlers, etc. would crash like big dogs all over the place. And
that just doesn't happen.
- -----------------------------------------------------------------
Willie Rauchwerger AppleLink: Willie
Telemedicine Software Guy Internet: willie-rauchwerger@uokhsc.edu
OU Health Sciences Center
+++++++++++++++++++++++++++
>From pottier@dmi.ens.fr (Francois Pottier)
Date: 8 Apr 1994 09:28:36 GMT
Organization: Ecole Normale Superieure, PARIS, France
In article <2o22ad$r3l@romulus.ucs.uoknor.edu>, Willie Rauchwerger <willie-rauchwerger@uokhsc.edu> writes:
|> In article <2o1rj9$4gb@asterix.drev.dnd.ca> Louis Demers,
|> louis@asterix.drev.dnd.ca writes:
|> > " How can function pointers (in C) be reliably used in
|> > an environment where code can be relocated without
|> > notice ? "
|>
|>
|> I would check your implementation of Function pointers. If I recall
|> right (Check New Inside Macintosh: Memory or was that Volume 6),
|> function pointers should remain valid throughout the execution time of
|> your software.
Well, you have two kinds of function pointers: pointers to functions
that are actually inside your program and known to the compiler, and
pointers to functions that have been loaded from code resources.
In the first case, when you use a pointer to a function inside your code,
the compiler actually generates a reference to its *jump table entry*.
The jump table entry contains a jump to the right address if the function
is inside a loaded segment. Otherwise it contains a _LoadSeg instruction,
which loads the segment first. So you needn't worry about loaded and
unloaded segments.
In the second case, your code loads a stand-alone code resource. It is
up to you to make sure that the resource doesn't move, otherwise your
function pointer will become stale. But it's very easy: just after
loading the resource, call HLock on it - it won't move any more, and
you can use it.
Two small catches: beware of heap fragmentation. Having a locked resource
right in the middle of your heap is a Bad Thing. Try to load resources
early in the program flow.
Also, if your program starts in 24-bit mode and switches to 32-bit mode
later on, be sure to call StripAddress on your function pointers.
I guess that's it. If I made any mistakes, corrections are welcome.
--
Francois Pottier
pottier@dmi.ens.fr
+++++++++++++++++++++++++++
>From c.reading@csi.compuserve.com (Charlie Reading)
Date: 8 Apr 94 13:16:58 GMT
Organization: CompuServe Incorporated
In article <2o1rj9$4gb@asterix.drev.dnd.ca> Louis Demers,
louis@asterix.drev.dnd.ca writes:
> " How can function pointers (in C) be reliably used in
> an environment where code can be relocated without
> notice ? "
First of all, you have to make sure the function you are passing a
pointer to is
represented in the jump table (the jump table is non-relocatable, so the
initial
address never moves). This can be accomplished by making it part of
another
segment (targets for inter-segment calls always show up in the jump
table) or use
a compiler switch which generates A5 relative addresses for function
addresses).
Appendix A in the MPW C++ Reference seems to indicate A5-relative
addressing is
the default, but if you are using "-b" or "-b2" it turns it around to
PC-relative
addressing. If this is the case, use "-b3" instead.
Alternately, just what are you passing a pointer to? Is it a "real" C
function or
is it a method? If you are actually passing a pointer to a method to
something that
requires a pointer to a function it will probably blow big chunks (due to
differences
in calling conventions).
--
Charlie Reading
CompuServe Incorporated
c.reading@csi.compuserve.com
Any opinions expressed are not necessarily those of my employer.
+++++++++++++++++++++++++++
>From Ron_Hunsinger@bmug.org (Ron Hunsinger)
Date: Sun, 10 Apr 94 21:15:48 PST
Organization: Berkeley Macintosh Users Group
louis@asterix.drev.dnd.ca (Louis Demers) writes:
>We are developping an application with MacApp 3.0.1,
>MPW C++. Part of the code uses functions pointers that
>are initialized at the beginning of the Application. Later
>when we use those function pointers, we crash because
>the code segment containing the function's code has been
>moved and the pointers are not pointing to the new location.
>
>What we would like to do is lock the proper code segment
>at the beginning so that our function pointers remain valid.
>
>This brings us to the more general consideration:
>
>" How can function pointers (in C) be reliably used in
> an environment where code can be relocated without
> notice ? "
To answer your second question first: When you take the address of a
procedure, the compiler can either take the address of the current
position of the procedure in memory, or the address of the jump table
entry for the procedure. If the place where you are taking the address
is in a different code segment than the procedure (an inter-segment
reference), the compiler has no choice but to do the latter (take the
address of the jump table entry). If they are in the same segment
(an intra-segment reference) the compiler can do it either way.
If there is any chance that the code segment might move, you need to
make sure that you get the address of the jump table entry. This
entry will remain valid even if the segment moves, and even if the
segment has been unloaded and removed from memory.
BTW: Code segments do not "move without notice". You have to specifically
unload them. Although, in the case of MacApp, it may seem that way,
because MacApp will automatically unload all code segments that have
not been marked resident each time through the event loop. (In MacApp
terminology, "resident" means "don't automatically unload".)
The only way you can be having problems is that:
a) You are making an intra-segment reference, and
b) You are permitting the compiler to take the address of the
current position of the procedure (using a PC-relative address), and
c) Between the time you take the address, and the time you use it, the
segment is being unloaded (allowing it to move).
You can fix the problem by changing any of these three conditions:
a) Force an inter-segment reference, by putting the initialization
routine that takes the address of the procedure into a different
code segment than the procedure itself (use #pragma segment), or
b) Tell the compiler to always use jump table addresses (set the -b3
compiler option, or do not set either -b or -b2), or
c) Never unload this code segment
c1) Put the target routine in one of the segments that MacApp is
already making resident (#pragma segment ARes), or
c2) Mark the segment resident at run time (call SetResidentSegment).
Method (a) is best - your initialization code should be in its own segment
that will be unloaded after initialization anyway. It is also the most
portable. All of the other methods have the disadvantage that they keep
the initialization code in memory for the lifetime of the program, which
is a waste of memory.
Method (b) could make the jump table bigger, as well as possibly confusing
MacApp, which assumes that intra-segment references are PC-relative. I
think this only matters in the debugger, and maybe not even there. The
larger jump table is the real problem - a MacApp program of any size can
easily generate a jump table over 32K, which is bad news unless you set
-model far.
Method (c2) would use a routine like:
void MakeProcAddressSafe (void *fct) {
if (!GetSegNumber ((ProcPtr)fct)) {
// GetSegNumber will return zero if fct does not point into
// the jump table. This is precisely the circumstance where
// we have to make sure the segment is resident.
SetResidentSegment (GetSegFromPC (fct), true); }
};
which you would call with something like:
aProcAddress = SomeProcedure;
MakeProcAddressSafe (aProcAddress);
-Ron Hunsinger
+++++++++++++++++++++++++++
>From jwbaxter@olympus.net (John W. Baxter)
Date: Tue, 12 Apr 1994 00:22:02 -0700
Organization: Internet for the Olympic Peninsula
In article <001393BF.fc@bmug.org>, Ron_Hunsinger@bmug.org (Ron Hunsinger)
wrote:
> louis@asterix.drev.dnd.ca (Louis Demers) writes:
>
> >We are developping an application with MacApp 3.0.1,
> >MPW C++. Part of the code uses functions pointers that
> >are initialized at the beginning of the Application. Later
> >when we use those function pointers, we crash because
> >the code segment containing the function's code has been
> >moved and the pointers are not pointing to the new location.
> >
> >What we would like to do is lock the proper code segment
> >at the beginning so that our function pointers remain valid.
...
> Method (c2) would use a routine like:
>
> void MakeProcAddressSafe (void *fct) {
> if (!GetSegNumber ((ProcPtr)fct)) {
> // GetSegNumber will return zero if fct does not point into
> // the jump table. This is precisely the circumstance where
> // we have to make sure the segment is resident.
> SetResidentSegment (GetSegFromPC (fct), true); }
> };
>
> which you would call with something like:
>
> aProcAddress = SomeProcedure;
> MakeProcAddressSafe (aProcAddress);
Or...include the segment is a res! resource, and let InitUMemory () mark it
resident for you. That's how MacApp's own resident segments are so marked,
and the expected method for application segments.
--
John Baxter Port Ludlow, WA, USA [West shore, Puget Sound]
jwbaxter@pt.olympus.net
---------------------------
>From John Hamilton Slye <jsbr+@andrew.cmu.edu>
Subject: INIT vs. Background Only App.
Date: Thu, 7 Apr 1994 23:49:45 -0400
Organization: Junior, Electrical and Computer Engineering, Carnegie Mellon, Pittsburgh, PA
I am writing a program which involves AppleTalk and I was eventually
going to make it an INIT - would it be bad if I made it a
background-only application that would be put in the Startup Items
folder? Would that violate any programming guidelines?
I don't know much about writing INITs - if anyone can point me to a good
step-by-step "how to write an INIT" guide somewhere I'd appreciate it.
It seems to me that it would be easier just to make my program a
background-only application - though this would mean it could only run
on machines with MultiFinder.
Any help on this would be much appreciated...thanks...
=========================================================================
J. Hamilton Slye (jsbr@andrew.cmu.edu) 1071 Morewood Ave., Pgh, Pa. 15213
"I know there are people in the world who do not love their fellow human
beings...and I HATE people like that!" - Tom Lehrer
=========================================================================
+++++++++++++++++++++++++++
>From Scott_Gruby@hmc.edu (Scott Gruby)
Date: 8 Apr 1994 04:18:05 GMT
Organization: Harvey Mudd College, Claremont CA
In article <EhdBFNu00iV8ACoVE2@andrew.cmu.edu>, John Hamilton Slye
<jsbr+@andrew.cmu.edu> wrote:
>
> I am writing a program which involves AppleTalk and I was eventually
> going to make it an INIT - would it be bad if I made it a
> background-only application that would be put in the Startup Items
> folder? Would that violate any programming guidelines?
>
> I don't know much about writing INITs - if anyone can point me to a good
> step-by-step "how to write an INIT" guide somewhere I'd appreciate it.
>
> It seems to me that it would be easier just to make my program a
> background-only application - though this would mean it could only run
> on machines with MultiFinder.
>
> Any help on this would be much appreciated...thanks...
>
>
>
>
> =========================================================================
> J. Hamilton Slye (jsbr@andrew.cmu.edu) 1071 Morewood Ave., Pgh, Pa. 15213
>
> "I know there are people in the world who do not love their fellow human
> beings...and I HATE people like that!" - Tom Lehrer
> =========================================================================
My personal opinion is that background-only applications (BOA) will cause
less problems in the future, i.e. no INIT conflicts (or at least there
shouldn't be any). It also looks like they are easier to write than INITs
(I say looks because I have never written an INIT, only a BOA). Here's a
neat thing you can do to BOAs and that is set the file type to 'appe' and
put it in the extensions folder. It loads immediately after the Finder
loads, but you can stick in some startup code that puts a startup icon.
As for supporting only machines that run MutliFinder, that is almost
becoming a non-problem. As programs get more and more complicated, running
anything on a machine not running Sys 7 is getting harder and harder.
There's some example BOA code on ftp.apple.com and also a tech note
explaining about BOAs.
Good luck!
--
Scott Allen Gruby (Scott_Gruby@hmc.edu)
Macintosh Student System Manager
Academic Computing, Harvey Mudd College
Claremont, CA
Finger ripem_public@eagle.st.hmc.edu for public key
+++++++++++++++++++++++++++
>From Aaron Wohl <aw0g+@andrew.cmu.edu>
Date: Fri, 8 Apr 1994 12:22:00 -0400
Organization: Systems Group 97, Carnegie Mellon, Pittsburgh, PA
I have written both inits and background only applications. The
sources are available via anonymous ftp from akutaktak.andrew.cmu.edu
[128.2.35.1] in the /aw0g directory.
Softkiss is a driver/cdev/init to reprogram the SCC hardware to do
syncronous HDLC to control a ham radio. Mailcheck is cdev/driver/init
to check your unix mail using UDP.
Finger server is faceless background task to implement the finger server
protocol for the macintosh.
A device driver installed by an init gives you a way for programs to
talk to your code once it is installed (they do a device driver call).
A faceless background task would be communicated over the network
(appletalk or UDP) if you needed to communicate with it.
Device drivers are harder to debug, run in the system heap (usually) and
if they leak memory usually leak system heap wich is worse than leaking
application heap. Device drivers are an apropriate place for code that
needs to patch system calls. Patches installed in applications only
affect that application and are switch with the application by
multifinder.
Aaron Wohl / ham callsign N3LIW / 412-731-3691 / 412-268-5032
+++++++++++++++++++++++++++
>From orch@aol.com (Orch)
Date: 12 Apr 1994 22:54:02 -0400
Organization: America Online, Inc. (1-800-827-6364)
A few years ago when System 7 was released at the Developers Conference, Apple
was trying to convince developer to avoid writting INITs when ever possible,
and instead write background applications.
---------------------------
>From awalters@leland.stanford.edu (Andrew J Walters)
Subject: Info on Graphics Animation Programming?
Date: 8 Apr 94 21:33:51 GMT
Organization: Stanford
I've been working on a board game where I want to move pieces around on
the
board. I'm currently using simple offscreen quickdraw, but it is slow
and
not very smooth. Where is a good source of information on animation
programming.
Thanks,
Andrew J Walters
+++++++++++++++++++++++++++
>From dwareing@apanix.apana.org.au (David Wareing)
Date: 11 Apr 94 10:59:24 GMT
Organization: Apanix Public Access Unix, +61 8 373 5485 (5 lines)
awalters@leland.stanford.edu (Andrew J Walters) writes:
>I've been working on a board game where I want to move pieces around on
>the
>board. I'm currently using simple offscreen quickdraw, but it is slow
>and
>not very smooth. Where is a good source of information on animation
>programming.
I could go into a whole list of arcane references for direct-to-screen
drawing, VBL tasks etc, but for your needs, I strongly suspect that
QuickDraw will do the job for you without you having to get your hands
*too* dirty.
Unless your board-games has a *lot* of moving sprites, or the sprites are
unusually large, it can more than likely be done well (very well actually)
with QuickDraw. These points and more, pop up all the time, but they are
always good to remember. They will speed up your animation like crazy:
* Use GWorlds. Nice. Easy. No mucking around with bits.
* Create your GWorlds with a call to NewGWorld. Pass it a screen depth of
'0'. This will create an offscreen PixMap that is longword aligned to the
screen. Pass the rect in global coords. Mucho speed increases here.
* This is obvious, but move the least number of pixels as possible. Don't
always CopyBits unions of rects if not necessary. For example, don't
get the unionrect if the old and new sprite rects are not touching.
Some playing around and timing tests are needed here.
* If you don't need special masking effects such as dissolves for your
sprites, but you still have irregularly-shaped sprites (i.e. sprites
that aren't rectangles), then *don't* use masks at all. Use the CopyBits
transfer mode 'transparent' instead to cleanly compose sprites on top
of backgrounds and other sprites. In my experience, CopyBits with
transparent, is faster than CopyBits with a maskRgn, and both are *much*
faster than using CopyMask or CopyDeepMask. If you do need special
masking effects (and remember, you can duplicate most effects offscreen
by manipulating the pixmaps anyway), only use CopyBits, with a maskRgn.
* Make sure that the source and destination pixmaps involved in a CopyBits
have identical ColorTables. Otherwise, poor ole CopyBits has extra work
to do. Old sagely advice says to "set the ctSeed field in the color
tables of the source and destination to be the same..". Now I don't know
if you really need to do this (haven't bothered to check personally,
and Alex Metcalf says he noticed no noticeable speed improvements), when
you have not changed the color tables at all. Left as an exerci... :)
* Ensure that src and dest rects are the same size, else CopyBits has
expensive stretching to do.
* Unless you want "masking" effects, only use a transfer mode of SrcCopy.
* This one will upset some folks. Take over the machine. Rule the roost.
At least for games. Games (and most other forms of animation) on the mac
are a different breed of app altogether. Do *not* call WNE, not unless
you want pathetic performance. If you must, call GNE or handle events
some other way that is less expensive. What about that modem you've got
buzzing away in the bgnd? Tough. A game is a game, and if its of the
arcade variety, then you need all the speed you can get, without having
to pander to other tasks. The game Deliverance sort of puts the lie to
this, as it handles bgnd tasks very well, while still maintaining very
decent animation rates. But that's a one-off :)
* Optimise your code a little more. I don't use SetRect, as I opt for
setting my rects by hand. Probably doesn't add much to the overall speed
at the end of the day, but it makes me feel nice and snug to know that
one less trap has been disposed of.
* Don't colorise (or colorize if you are on the other side of the pond).
This means that you should make sure that the fg colour is black and the
bg colour is white. Else, CopyBits has extra work to do again.
Most of these points (and many more) are described in detail in a very
handy tech note (get it at ftp.apple.com) called QD 21 "Time Space and
CopyBits" by Forrest Tanaka. Well worth the money :)
I use the book "Programming QuickDraw" by Surovell et al. Covers Sys 7,
all versions of QD to date, and despite its lousy index, meandering spirit
and occasionally buggy or incomplete examples, is a good buy, and covers a
lot of handy topics. (It also misses a few too...).
Develop has a whole range of articles and example code/apps. Don't know
the US price, but its easily the development bargain of the decade.
Finally, there are several packages out there in ftp.land just waiting to
be picked up and used. SAT (Sprite Animation Toolkit) by Ingemar Ragnemalm
is a CopyBits replacement (and then some!), which would be highly suitable
for games development. Fast with good documentation and lots of examples.
Pascal and C from memory.
Cellusoft Animation (or somesuch thing) is a shareware thingy available at
your friendly ftp site from Tony Small. This is bascially a CopyBits
animation tutorial, complete with working code, executables and docs.
SpriteWorld by Tony Myles is a comprehensive sprite animation package,
competing with SAT. Comes with code, executables, docs.
Happy blitting, and remember: CopyBits is certainly up to the job of many
games. It can handle your average boardgame with ease, and Pacman type
affairs shouldn't be a problem either.
--
David Wareing
Adelaide, South Australia
Mac Games & Multimedia Development dwareing@apanix.apana.org.au
- --------------------------------------------------------------------
+++++++++++++++++++++++++++
>From al@crucible.powertools.com (Al Evans)
Date: 13 Apr 94 18:06:31 GMT
Organization: PowerTools, Austin, Texas
In article <dwareing.766061964@apanix.apana.org.au> dwareing@apanix.apana.org.au (David Wareing) writes:
>awalters@leland.stanford.edu (Andrew J Walters) writes:
>>I've been working on a board game where I want to move pieces around on
>>the
>>board. I'm currently using simple offscreen quickdraw, but it is slow
>>and
>>not very smooth. Where is a good source of information on animation
>>programming.
> Old sagely advice says to "set the ctSeed field in the color
> tables of the source and destination to be the same..". Now I don't know
> if you really need to do this (haven't bothered to check personally,
> and Alex Metcalf says he noticed no noticeable speed improvements), when
> you have not changed the color tables at all. Left as an exerci... :)
As long as you're using the system color table for both source and
destination, which you are if you haven't changed it, there is no
speed difference.
>Finally, there are several packages out there in ftp.land just waiting to
>be picked up and used.
[SAT, Cellusoft Animation, SpriteWorld...]
You also might want to take a look at my own Graphic Elements, available
from mac.archive.umich.edu and mirror sites as:
/mac/misc/demo/graphicelementsdemo.sit.hqx
It offers performance comparable to that of SAT or SpriteWorld, with
a more "object-oriented" programming interface. It also has a few
"special features" -- for example, using horizontal and vertical
mirroring, you could get all four possible orientations of a game
piece out of the same graphic, which might be handy in a board game.
--Al Evans--
--
Al Evans | Graphic Elements: A new standard for
| high-performance interactive Macintosh graphics.
al@crucible.powertools.com | Available from mac.archive.umich.edu
| /mac/misc/demo/graphicelementsdemo.sit.hqx
---------------------------
>From Wilson Swee <ws8n+@andrew.cmu.edu>
Subject: Launching an application from a program...
Date: Tue, 12 Apr 1994 02:24:24 -0400
Organization: Senior, Math/Computer Science, Carnegie Mellon, Pittsburgh, PA
Is it possible to launch an application from a program already running?
If so, what is a good way of handling it?
Wilson
+++++++++++++++++++++++++++
>From greer@utdallas.edu (Dale M. Greer)
Date: 12 Apr 1994 14:20:54 GMT
Organization: The University of Texas at Dallas
Wilson Swee (ws8n+@andrew.cmu.edu) wrote:
> Is it possible to launch an application from a program already running?
> If so, what is a good way of handling it?
> Wilson
Yes, and there is a very good example of this called AE Interaction
Sample of ftp.apple.com. I don't remember the filepath for this, but
I think is was in the snippets directory under interapp.comm. If
you don't have access to ftp.apple.com, I could e-mail some stuff
to you. The whole Sample is about 160K, but the FindAndLaunchApp
code is pretty small.
--
Dale Greer, greer@utdallas.edu
"You can't just wake up and kiss the mirror and say 'I'm so purdy,
I think I'll run for Governor.'" - Texas Gov. Ann Richards
+++++++++++++++++++++++++++
>From tchan@irus.rri.uwo.ca (Thomas KC Chan)
Date: 13 Apr 1994 16:58:13 GMT
Organization: Robarts Research Institute, UWO, London, Ontario
And if you have the Think C on-line reference, there are enough
examples in implementing it; the examples should be similar to those
given in "Inside MACintosh..." manuals.
Thomas Chan e-mail: tchan@irus.rri.uwo.ca
+++++++++++++++++++++++++++
>From nickt@tigger.demon.co.uk (nick thompson)
Date: Wed, 13 Apr 1994 21:14:42 GMT
Organization: Demon Internet
Someone asked for some app launching code. Here are tow handy routines
- one for seeing if an app is running and one for launching an app.
You can use it like this:
// if we are running we want the PSN and stuff,
// otherwise we need to launch it and get the information
if(!IsAppRunning( 'APPL',
'SiCk',
&targetPSN,
&targetPIRec,
targetName ) ) {
err = LaunchApp( 'SiCk' ) ;
}
Nick
- -------------
// check to see using the process manager whether our
// target app is running
Boolean IsAppRunning( OSType targetType,
OSType targetSignature,
ProcessSerialNumber *targetPSN,
ProcessInfoRec *targetPIRec,
StringPtr targetName )
{
// we want to return the PSN if there is one
// we want to return the Proc Info Rec if there is one
// we will return true if we found our App
// false if it wasn't running.
// we need to loop through all the running processes and
// find one that looks like our background task.
// This is all standard stuff - see IM Process Manager, page 2-6
targetPSN->highLongOfPSN = 0 ;
targetPSN->lowLongOfPSN = kNoProcess ;
// set up the info record, for the call to get process info
targetPIRec->processInfoLength = sizeof( ProcessInfoRec ) ;
targetPIRec->processName = targetName ; // the name will be put in
here
targetPIRec->processAppSpec = nil ; // we do not care about the
location of the app
// right, loop through the running processes
while( GetNextProcess( targetPSN ) == noErr ) {
if( GetProcessInformation( targetPSN, targetPIRec ) == noErr ) {
if( targetPIRec->processType == targetType
&& targetPIRec->processSignature == targetSignature )
return true ;
}
}
return false ;
}
// search in the desktop database for the app so that we can launch it
OSErr LaunchApp( OSType targetSignature)
{
DTPBRec theDatabase ;
LaunchParamBlockRec theLPB ;
FSSpec targetFSSpec ;
OSErr err ;
theDatabase.ioCompletion = 0L ;
theDatabase.ioNamePtr = 0L ;
theDatabase.ioVRefNum = -1 ; // restrict search to boot volume only
if(( err = PBDTGetPath( &theDatabase )) != noErr )
return err ;
theDatabase.ioIndex = 0 ;
theDatabase.ioFileCreator = targetSignature ;
theDatabase.ioNamePtr = (StringPtr)targetFSSpec.name ;
if(( err = PBDTGetAPPL( &theDatabase, false )) != noErr)
return err ;
targetFSSpec.vRefNum = theDatabase.ioVRefNum ;
targetFSSpec.parID = theDatabase.ioAPPLParID ;
theLPB.launchBlockID = extendedBlock ;
theLPB.launchEPBLength = extendedBlockLen ;
theLPB.launchFileFlags = 0 ;
theLPB.launchControlFlags = launchContinue + launchNoFileFlags +
launchUseMinimum ;
theLPB.launchAppSpec = &targetFSSpec ;
theLPB.launchAppParameters = 0L ;
return( LaunchApplication( &theLPB ) ) ;
}
---------------------------
>From craig@gpu.utcc.utoronto.ca (Craig Hubley)
Subject: Looking for a Windows-Mac portable GUI toolkit or builder
Date: Wed, 30 Mar 1994 11:45:16 GMT
Organization: UTCC Public Access
Would like to find a tool or toolkit that allows Windows and Mac
GUIs to be controlled from the same source code. I am aware of
some tools (e.g. C++/Views, CommonView, XVT, etc.) but have not
heard from anyone who has used the latest versions to actually
build source-code-compatible systems. Also I have heard that the
latest Borland C++ has classes that cover the difference completely.
Can anyone back this up ?
Would be interested in particular in Smalltalk based tools.
Also in the running for a good portable flatfile database toolkit.
Important criteria for both are source code compatibility across
Windows and Mac, royalty free distribution of runtimes (product
is for mass market), and ideally an object oriented binding in
C++ or Smalltalk. I can live with C but will be talking to it
from C++ or Smalltalk in that case.
Thanks for any help you can offer
--
Craig Hubley -- Consultants in object-oriented technology, languages, --
Craig Hubley & Associates -- user interface design, user productivity --
craig@utcc.Utoronto.CA -- and financially responsive methodologies --
Seventy Eaton Avenue, Toronto, Ontario, Canada M4J 2Z5 -- 416-969-2826 --
+++++++++++++++++++++++++++
>From scharf@lrs.e-technik.uni-erlangen.de (Ron Scharf)
Date: Thu, 31 Mar 1994 13:24:16 +0200
Organization: LRS, University of Erlangen, Germany
craig@gpu.utcc.utoronto.ca (Craig Hubley) writes:
>Would like to find a tool or toolkit that allows Windows and Mac
>GUIs to be controlled from the same source code. I am aware of
>some tools (e.g. C++/Views, CommonView, XVT, etc.) but have not
>heard from anyone who has used the latest versions to actually
>build source-code-compatible systems.
You might check Neuron Data's "Open Interface"; it's a GUI builder that
does not only allow system-independent interface creation (on Mac, Windows,
OpenLook, Motif and OS/2 Presentation Manager), but also allows you to
change the "look and feel" of your application at runtime to any of the
above listed - on any machine. So one can e. g. run an application on a Mac
and change - if he likes (?!) - the user interface to resemble that under
Windows. (Just telling what I've seen; no comments whether this will make
sense or not ;-). I've seen a demo where they used the same C source generated
by Open Interface to build GUIs for Macs, Windows and SUN OpenLook. Pretty
impressive. As far as I know, there are runtime libraries involved which you
have to buy; so you can't give an application away free of charge (although a
distribution license shall be rather cheap, as I've been told).
You can reach Neuron Data in the US at 156 University Ave., Palo Alto, CA 94301,
Phone 415-321-4488 Fax 415-321-3728.
Hopethishelps
Ron
P.S. I'm in no way affiliated to Neuron Data or the like... Just saw a demo
of this (along with their expert system shell "Nexpert Object") some weeks ago.
--
Ron Scharf -- scharf@lrs.e-technik.uni-erlangen.de -- ron.scharf@msn.rmi.de
Institute of Computer Aided Circuit Design -- University of Erlangen -- Germany
* PET2001 * SX-64 * Amiga1000 * Mac SE/30 * Newton MessagePad *
"...this is not a love song, this isn't fantasy land..." - Rush, "Cold Fire"
+++++++++++++++++++++++++++
>From mxmora@unix.sri.com (Matt Mora)
Date: 31 Mar 1994 10:35:26 -0800
Organization: SRI International, Menlo Park, CA
In article <scharf.765112226@faulrs> scharf@lrs.e-technik.uni-erlangen.de (Ron Scharf) writes:
>above listed - on any machine. So one can e. g. run an application on a Mac
>and change - if he likes (?!) - the user interface to resemble that under
>Windows. (Just telling what I've seen; no comments whether this will make
You can do that for motif and windows but not mac. The mac interface is only
available on the mac.
>sense or not ;-). I've seen a demo where they used the same C source generated
>by Open Interface to build GUIs for Macs, Windows and SUN OpenLook. Pretty
>impressive. As far as I know, there are runtime libraries involved which you
>have to buy; so you can't give an application away free of charge (although a
>distribution license shall be rather cheap, as I've been told).
Actually, there are no runtime fees. So you can give it away to whomever.
As a developer you need to buy a developer "seat" which includes all the
things you need to create programs that run on your platform. You can also
buy "porting" kits for the platforms you want to deploy your program to.
Neuron recommends that you actually but a dev seat for each platform because
they price the porting kits almost as high as the development seats.
Xavier
--
___________________________________________________________
Matthew Xavier Mora Matt_Mora@sri.com
SRI International mxmora@unix.sri.com
333 Ravenswood Ave Menlo Park, CA. 94025
+++++++++++++++++++++++++++
>From edandavi@well.sf.ca.us (Ed Allen and Avi Rappoport)
Date: 2 Apr 1994 23:55:33 GMT
Organization: The Whole Earth 'Lectronic Link, Sausalito, CA
I know a company that has actually used XVT for a shipping product. Please
email me (attn: Avi) and I'll send you their name & phone number.
Avi Rappoport
- ------------
Using my own account, looking for a job (project management).
+++++++++++++++++++++++++++
>From ari@world.std.com (Ari I Halberstadt)
Date: Tue, 12 Apr 1994 16:09:35 GMT
Organization: The World Public Access UNIX, Brookline, MA
In article <scharf.765112226@faulrs>,
Ron Scharf <scharf@lrs.e-technik.uni-erlangen.de> wrote:
>craig@gpu.utcc.utoronto.ca (Craig Hubley) writes:
>
>>Would like to find a tool or toolkit that allows Windows and Mac
>>GUIs to be controlled from the same source code. I am aware of
>>some tools (e.g. C++/Views, CommonView, XVT, etc.) but have not
>>heard from anyone who has used the latest versions to actually
>>build source-code-compatible systems.
>
>You might check Neuron Data's "Open Interface"; it's a GUI builder that
Try the book
Petrucci, Steve, "Cross-Platform Power Tools", Random House, 1993.
ISBN 0-679-79147-7. US$45.00.
The book describes many of the issues involved in developing a cross-
platform solution. A CD-ROM that contains a cross-platform library,
called "XPLIB", for Windows 3.1, Win32, and Macintosh is included. I
don't have a CD-ROM player, so I haven't been able to use XPLIB yet,
though you can swap the CD for floppies by writing to Random House
(I'd rather save my money and get a CD-ROM player). Licensing of XPLIB
for use in products is not really covered in the book, so I think
you'd have to contact the author to arrange for commercial use. Still,
$45 is pretty cheap for a cross-platform system. I also think it's a
good way for people who know Macintosh to get their feet wet in
Windows (and vice-versa).
--
Ari Halberstadt ari@world.std.com #include <std/disclaimer.h>
"These beetles were long considered to be very rare because very few
entomologists look for beetles in the mountains, in winter, at night,
during snow storms." -- Purves W. K., et al, "Life: The Science of
---------------------------
>From Chris Hanson <chanson@mtlookitthat.chi.il.us>
Subject: PowerPC Anti-Aliased Text
Date: Sun, 10 Apr 94 12:22:02 -0600
Organization: Green Dragon Creations, Inc.
Here's an idea:
Now that PowerPC is out, many users have more processing power than they
know what to do with. (<= No flames please...) Ergo we must find
creative ways to burn all those cycles. In reading Stewart Brand's "The
Media Lab", I discovered the MIT research on anti-aliased text and how
it's much easier to read etc.
SO... How hard would it be to implement a PowerPC extension that
maintains an offscreen GWorld and patches QuickDraw's text-drawing
routines? It would render the text at 2x or 4x actual size and then
copy it to its intended destination at regular size with ditherCopy. I
figure a PowerPC should have enough CPU horsepower so this wouldn't
noticeably degrade performance -- right?
Where would be the best place to patch this in?
TTFN,
Chris
+++++++++++++++++++++++++++
>From d88-jwa@mumrik.nada.kth.se (Jon Wätte)
Date: 10 Apr 1994 19:34:20 GMT
Organization: The Royal Institute of Technology
In <94041012220221834@mtlookitthat.chi.il.us> Chris Hanson <chanson@mtlookitthat.chi.il.us> writes:
>Where would be the best place to patch this in?
Tail-patch OpenPort and OpenCPort to install their own text drawing
procs, which set the port to the offscreen port, fall throught to
the normal StdText, and then set the port back, CopyBits, and update
the pen location.
--
-- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
"Don't stick a Fork in your Eye."
+++++++++++++++++++++++++++
>From gdl@stlawrence.maths (Greg Landweber)
Date: 11 Apr 1994 00:22:11 GMT
Organization: (none)
In article <94041012220221834@mtlookitthat.chi.il.us> Chris Hanson <chanson@mtlookitthat.chi.il.us> writes:
Now that PowerPC is out, many users have more processing power than they
know what to do with. (<= No flames please...) Ergo we must find
creative ways to burn all those cycles. In reading Stewart Brand's "The
Media Lab", I discovered the MIT research on anti-aliased text and how
it's much easier to read etc.
Take a look at the latest version of Greg's Browser (just released to
sumex and umich). It has an option to use anti-aliased text for its
main window font. It's done in 680x0 code (and it isn't too slow if
you have a 68040), but it will be the first part that I port to
PowerPC native code (as soon as Metrowerks releases Code Warrior
DR/3 which I am told will generate the type of resources that I need).
SO... How hard would it be to implement a PowerPC extension that
maintains an offscreen GWorld and patches QuickDraw's text-drawing
routines? It would render the text at 2x or 4x actual size and then
copy it to its intended destination at regular size with ditherCopy. I
figure a PowerPC should have enough CPU horsepower so this wouldn't
noticeably degrade performance -- right?
I considered doing this a few months ago (when I first tried the
anti-aliasing code for Greg's Browser). Unfortunately, this would be too
slow on a 680x0 Mac, and I'm not planning on buying a PowerMac until
I'm back in the USA in the fall. It won't be hard to get the
anti-aliasing code wo1rking, but I'm not about to start debugging trap
patches without a machine to test on...
There was an article in Develop a while back explaining how to do
anti-aliasing. If you want it to go at a good speed, you should write
your own ditherCopy-substitute, and I believe there was a follow-up
article in Develop describing that as well.
Where would be the best place to patch this in?
Somewhere around the StdText routine.
-- Greg "Buttons"/"Browser" Landweber
gdl@maths.ox.ac.uk
+++++++++++++++++++++++++++
>From cwiltgen@mcs.com (Charles Wiltgen)
Date: Sun, 10 Apr 1994 21:20:09 -0600
Organization: Waterman Design, Inc. (opinions are my own)
In article <94041012220221834@mtlookitthat.chi.il.us>, Chris Hanson
<chanson@mtlookitthat.chi.il.us> wrote:
> Here's an idea:
And a *great* one it is.
> Now that PowerPC is out, many users have more processing power than they
> know what to do with. (<= No flames please...) Ergo we must find
> creative ways to burn all those cycles. In reading Stewart Brand's "The
> Media Lab", I discovered the MIT research on anti-aliased text and how
> it's much easier to read etc.
Absolutely. Hopefully QuickDrawGX lets you do this more easily.
I was thinking that there may be some cases where you wouldn't want to
antialiased text, so a box with both application and font exceptions would
be nice. Then you can specify that test in ThinkC shouldn't be
antialiased, and that you never want Chicago and Geneva (for example)
antialiased.
--
Charles Wiltgen "Love is a snowmobile racing across the tundra and
cwiltgen@mcs.com then suddenly it flips over, pinning you underneath.
(INTP) At night, the ice weasels come." - Nietzsche (Groening)
+++++++++++++++++++++++++++
>From d88-jwa@hemul.nada.kth.se (Jon Wätte)
Date: 11 Apr 1994 09:26:41 GMT
Organization: The Royal Institute of Technology
>> Media Lab", I discovered the MIT research on anti-aliased text and how
>> it's much easier to read etc.
>Absolutely. Hopefully QuickDrawGX lets you do this more easily.
Nope; QuickDraw GX is presently a one-color-only system.
No anti-aliasing yet :-(
--
-- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
This signature is kept shorter than 4 lines in the interests of UseNet
S/N ratio.
+++++++++++++++++++++++++++
>From grstate@shade (Gavriel State)
Date: Tue, 12 Apr 1994 22:10:58 GMT
Organization: University of Waterloo
Chris Hanson (chanson@mtlookitthat.chi.il.us) wrote:
: Here's an idea:
: SO... How hard would it be to implement a PowerPC extension that
: maintains an offscreen GWorld and patches QuickDraw's text-drawing
: routines? It would render the text at 2x or 4x actual size and then
: copy it to its intended destination at regular size with ditherCopy. I
: figure a PowerPC should have enough CPU horsepower so this wouldn't
: noticeably degrade performance -- right?
Rather than doing it this way, it would be better to maintain a cached
anti-aliased version of each font in a seperate GWorld. This will make
the actual drawing of any piece of text much faster since you won't be
forced to do a ditherCopy every time you draw some text - instead you can
use srcOr. It'll be more work since you'll have to worry about the
font metrics, etc, but if done correctly this doesn't have to be for
PMacs only. I think it would be plenty fast enough for '040 Macs....
You'd probably want to have some scheme to decide which fonts to cache
and when - otherwise you'll end up eating gobs and gobs of memory caching
fonts....but hey - the PowerMacs come with 8 Megs, so what does a few
hundred K of cached fonts matter, right? ;-)
--
Gavriel State | 3B Systems Design Engineering/Economics | Univ. of Waterloo
Email: grstate@zeus.uwaterloo.ca| "You can't 'not be' on a boat!"
- ------------------------------| "I've often not been on boats."
(905) 669-5652 (in Toronto) |"No, what you've been is often not on boats."
(519) 886-5765 (in Waterloo) | Rosencrantz and Guildenstern are Dead
+++++++++++++++++++++++++++
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Date: Tue, 12 Apr 1994 21:49:47 GMT
Organization: Apple Computer
Chris Hanson, chanson@mtlookitthat.chi.il.us writes:
> SO... How hard would it be to implement a PowerPC extension that
> maintains an offscreen GWorld and patches QuickDraw's text-drawing
> routines?
It might be easier just to use a grayscale font. These are supported by Color
QuickDraw but there used to be bugs in rendering them in some circumstances.
(Don't know if these have ever been fixed.)
I've built some anti-aliased fonts (and you can play around with it in
PhotoShop or ColorIt.) In my opinion antialiased text works well at very
small sizes, say <9pt, because it is actually decipherable unlike b/w text;
and at large sizes, say >=24pt because it's prettier. In intermediate sizes
it just looks blurry and gives you a headache.
I think a lot of this could be improved if the hinting process knew about the
anti-aliasing, but that would require a lot of work inside the TrueType (or
ATM) renderer.
--Jens Alfke
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
+++++++++++++++++++++++++++
>From sho@bohr.physics.purdue.edu (Sho Kuwamoto)
Date: 13 Apr 94 15:43:58 GMT
Organization: Purdue University Physics Department
In article <Co62yB.IEB@watserv2.uwaterloo.ca> grstate@zeus.uwaterloo.ca writes:
>Rather than doing it this way, it would be better to maintain a cached
>anti-aliased version of each font in a seperate GWorld. This will make
>the actual drawing of any piece of text much faster since you won't be
>forced to do a ditherCopy every time you draw some text - instead you can
>use srcOr.
This becomes a less practical solution if you want to do
sub-pixel level positioning.
-Sho
--
sho@physics.purdue.edu <<-- finger this account to find out what I'm
having for lunch!
<A HREF="http://physics.purdue.edu/~sho/homepage.html>Sho Kuwamoto</A>.
+++++++++++++++++++++++++++
>From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
Date: 14 Apr 94 13:10:15 +1200
Organization: University of Waikato, Hamilton, New Zealand
In article <1994Apr12.214947.10961@gallant.apple.com>, Jens Alfke <jens_alfke@powertalk.apple.com> writes:
>
> I've built some anti-aliased fonts (and you can play around with it in
> PhotoShop or ColorIt.) In my opinion antialiased text works well at very
> small sizes, say <9pt, because it is actually decipherable unlike b/w text;
> and at large sizes, say >=24pt because it's prettier. In intermediate sizes
> it just looks blurry and gives you a headache.
>
> I think a lot of this could be improved if the hinting process knew about the
> anti-aliasing, but that would require a lot of work inside the TrueType (or
> ATM) renderer.
In my partially-informed opinion, it's pointless to do both hinting and
anti-aliasing. Hinting is there to aid readability by removing irregularities
in the rendering of the text. Anti-aliasing is just there to smooth over the
irregularities; I don't believe it actually improves readability any.
Refutations (with evidence) welcomed...!
Lawrence D'Oliveiro fone: +64-7-856-2889
Info & Tech Services Division fax: +64-7-838-4066
University of Waikato electric mail: ldo@waikato.ac.nz
Hamilton, New Zealand 37^ 47' 26" S, 175^ 19' 7" E, GMT+12:00
+++++++++++++++++++++++++++
>From dowdy@apple.com (Tom Dowdy)
Date: Thu, 14 Apr 1994 01:59:39 GMT
Organization: Apple Computer, Inc.
In article <1994Apr14.131015.27573@waikato.ac.nz>, ldo@waikato.ac.nz
(Lawrence D'Oliveiro, Waikato University) wrote:
> In article <1994Apr12.214947.10961@gallant.apple.com>, Jens Alfke <jens_alfke@powertalk.apple.com> writes:
> >
> > I've built some anti-aliased fonts (and you can play around with it in
> > PhotoShop or ColorIt.) In my opinion antialiased text works well at very
> > small sizes, say <9pt, because it is actually decipherable unlike b/w text;
> > and at large sizes, say >=24pt because it's prettier. In intermediate sizes
> > it just looks blurry and gives you a headache.
> >
> > I think a lot of this could be improved if the hinting process knew about the
> > anti-aliasing, but that would require a lot of work inside the TrueType (or
> > ATM) renderer.
>
> In my partially-informed opinion, it's pointless to do both hinting and
> anti-aliasing. Hinting is there to aid readability by removing irregularities
> in the rendering of the text.
Well, there are *some* things that are better done at a lower level.
One of the problems with the scale-to-4X and downsample to the
original size is that the font at 4X may actually look quite a bit
different than it normally does at (say), 12 point.
There are better things that you can do if you know that the 4X scale
is "just pretend" and the only piece to know this is the scaler.
> Anti-aliasing is just there to smooth over the
> irregularities; I don't believe it actually improves readability any.
> Refutations (with evidence) welcomed...!
I'm sure you'll get lots of "does *too* work!" without evidence.
I've yet to see any real studies that show that anti-aliasing
improves readability.
*Lots* of people think that it looks better, and will claim things
such as "with systems that I've seen I can read text down to 4 point"...
I think probably the only practical use is in preparing slides,
where the results will be projected very large -- and that's the
difficult case, because you need to antialias against
the background area, which is typically a ramp-fill or something.
--
Tom Dowdy Internet: dowdy@apple.COM
Apple Computer MS:302-3KS UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
1 Infinite Loop AppleLink: DOWDY1
Cupertino, CA 95014
"The 'Ooh-Ah' Bird is so called because it lays square eggs."
+++++++++++++++++++++++++++
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Date: Thu, 14 Apr 1994 22:50:19 GMT
Organization: Apple Computer
Lawrence D'Oliveiro, ldo@waikato.ac.nz writes:
> In my partially-informed opinion, it's pointless to do both hinting and
> anti-aliasing. Hinting is there to aid readability by removing
irregularities
> in the rendering of the text. Anti-aliasing is just there to smooth over the
> irregularities; I don't believe it actually improves readability any.
(a) Antialiasing greatly improves readability at small sizes. Proof: I can
read 4pt type if it's antialiased, but can't if it isn't. I do NOT believe it
improves readability at normal text (>=10pt) sizes.
(b) One of the problems with antialiasing by drawing the text at a larger
size and then shrinking it down is that the hinter lines features up with the
finer grid, but not necessarily with the final shrunk grid. This means that
edges and corners usually don't line up with exact pixels and you get gray
edges or little gray blobs sticking out. You can see this even with large
antialiased text. This is exactly the kind of problem that hinting is
designed to help with; the problem is that the hinting is using the finer
grid and not the coarser one. I believe that if the hinter used the coarse
grid but rendered to the finer one, the results would be a lot nicer. It
_might_ be possible to fix the instructions on a TrueType font to make it do
this...
--Jens Alfke (former type weenie)
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
+++++++++++++++++++++++++++
>From hall_j@sat.mot.com (Joseph Hall)
Date: Wed, 13 Apr 1994 02:41:47 GMT
Organization: Motorola Inc., Satellite Communications
Seems it was gdl@stlawrence.maths (Greg Landweber) who said:
>There was an article in Develop a while back explaining how to do
>anti-aliasing. If you want it to go at a good speed, you should write
>your own ditherCopy-substitute, and I believe there was a follow-up
>article in Develop describing that as well.
Hmm. I assume the article uses spatial filtering, but that isn't an
optimal method for antialiasing objects in general. You really need
to have antialiasing built into the TrueType scan converter, and
then implement a transparency plane for color fonts. Now, *that* would
be a patch you could be proud of!
--
Joseph Nathan Hall | Joseph's Law of Interface Design: Never give your users
Software Architect | a choice between the easy way and the right way.
Gorca Systems Inc. | joseph@joebloe.maple-shade.nj.us (home)
(on assignment) | (602) 732-2549 (work) Joseph_Hall-SC052C@email.mot.com
---------------------------
>From Chris Roberts <ctr@pyrite.som.cwru.edu>
Subject: SubLaunching applications and DA's
Date: 8 Apr 1994 16:42:39 GMT
Organization: Case Western Reserve University
OK, one more time...
I'm having a serious problem with some code I'm writing.. It is intended
to sublaunch applications...
Whenever I launch an application (via launch()) or a deskaccessory (via
OpenDeskAcc)
The application or DA doesn't launch...
Instead, it waits until I switch applications, or quit...
I don't quite get what's wrong because I know I have made calls to
WaitNextEvent
after the call to launch or OpenDeskAcc..
Could there be something wrong with the way I'm calling WaitNextEvent?
I'm calling it like:
WaitNextEvent(everyEvent, &theEvent, 0xFFFFFFFF, NIL);
Is there something I should be doing differently?
Thanks,
Chris
+++++++++++++++++++++++++++
>From platypus@cirrus.som.cwru.edu (Gary Kacmarcik)
Date: 08 Apr 1994 18:44:04 GMT
Organization: Case Western Reserve University, Cleveland, Ohio (USA)
In article <2o41hv$7l0@usenet.INS.CWRU.Edu> Chris Roberts <ctr@pyrite.som.cwru.edu> writes:
>
> OK, one more time...
> I'm having a serious problem with some code I'm writing.. It is intended
> to sublaunch applications...
>
> Whenever I launch an application (via launch()) or a deskaccessory (via
> OpenDeskAcc)
> The application or DA doesn't launch...
it sounds like you're using the old interfaces. have you tried using the
LaunchApplication and LaunchDeskAccessory routines described in
IM: Processes?
these routines are working just dandy for me.
-gary j kacmarcik
platypus@cirrus.som.cwru.edu
+++++++++++++++++++++++++++
>From lrucker@parcplace.com (Lee Ann Rucker)
Date: 9 Apr 1994 00:08:30 GMT
Organization: ParcPlace
In article <PLATYPUS.94Apr8144404@cirrus.som.cwru.edu>,
platypus@cirrus.som.cwru.edu (Gary Kacmarcik) wrote:
> it sounds like you're using the old interfaces. have you tried using the
> LaunchApplication and LaunchDeskAccessory routines described in
> IM: Processes?
>
> these routines are working just dandy for me.
I'm using them in an MPW tool to run applications, but I'd like to be able
to specify a file for the app to open. IM:Processes says that the
AppParameters struct can be used for sending an AppleEvent, but doesn't
explain how to set it up. Could anyone provide sample code to do this?
Thanks
+++++++++++++++++++++++++++
>From platypus@cirrus.som.cwru.edu (Gary Kacmarcik)
Date: 09 Apr 1994 14:24:18 GMT
Organization: Case Western Reserve University, Cleveland, Ohio (USA)
In article <lrucker-080494160935@leeann-mac.parcplace.com> lrucker@parcplace.com (Lee Ann Rucker) writes:
>
> I'm using them in an MPW tool to run applications, but I'd like to be able
> to specify a file for the app to open. IM:Processes says that the
> AppParameters struct can be used for sending an AppleEvent, but doesn't
> explain how to set it up. Could anyone provide sample code to do this?
i haven't tried using the AppParameters struct.
why isn't it acceptable to send an 'odoc' event after the app is opened?
-gary j kacmarcik
platypus@cirrus.som.cwru.edu
+++++++++++++++++++++++++++
>From lrucker@parcplace.com (Lee Ann Rucker)
Date: 10 Apr 1994 19:35:57 GMT
Organization: ParcPlace
In article <PLATYPUS.94Apr9102418@cirrus.som.cwru.edu>,
platypus@cirrus.som.cwru.edu (Gary Kacmarcik) wrote:
|
| In article <lrucker-080494160935@leeann-mac.parcplace.com>
lrucker@parcplace.com (Lee Ann Rucker) writes:
| >
| > I'm using them in an MPW tool to run applications, but I'd like to be
able
| > to specify a file for the app to open. IM:Processes says that the
| > AppParameters struct can be used for sending an AppleEvent, but doesn't
| > explain how to set it up. Could anyone provide sample code to do this?
|
| i haven't tried using the AppParameters struct.
|
| why isn't it acceptable to send an 'odoc' event after the app is opened?
|
|
| -gary j kacmarcik
| platypus@cirrus.som.cwru.edu
Hadn't thought of that. I'm not the one who wants to do it, actually - we
have customers who say "I can open an app with parameters with your Windows
product, how would I do the same thing on the Mac?"
I'm still curious about AppParameters, though.
+++++++++++++++++++++++++++
>From Deirdre Maloy <Deeny3@aol.com>
Date: Mon, 11 Apr 1994 20:26:38 GMT
Organization: Metro Information Services, Raleigh NC
The sample code is given in one of the CD-roms in the bowels somewhere.
I've modified it somewhat, but it's been working for over a year, so I
know it's solid.
extern FInfo appFInfo;
extern launchRecord myLaunchInfo[MAX_SUBLAUNCHES]; // info on where
app is located
extern short currentLaunch;
extern Str255 myFile;
extern AEDesc myAddress,docDesc,launchDesc;
extern AEDescList theList;
extern AliasHandle withThis;
extern AppleEvent myAEvent;
void addOpDocEvt(void)
{
OSErr myErr;
ProcessSerialNumber myPSN;
GetCurrentProcess(&myPSN);
myErr = AECreateDesc(typeProcessSerialNumber, (Ptr)&myPSN,
sizeof(ProcessSerialNumber), &myAddress);
AECreateAppleEvent(kCoreEventClass,kAEOpenDocuments, &myAddress, -1, 0,
&myAEvent);
AECreateList(0L, 0, FALSE, &theList);
NewAlias(0L,&myLaunchInfo[currentLaunch].docName,&withThis);
HLock((Handle)withThis);
AECreateDesc(typeAlias,(Ptr)*withThis,GetHandleSize((Handle)withThis),&
ocDesc);
HUnlock((Handle)withThis);
AEPutDesc(&theList,0,&docDesc);
AEPutParamDesc(&myAEvent,keyDirectObject,&theList);
AECoerceDesc(&myAEvent,typeAppParameters,&launchDesc);
HLock((Handle)myAEvent.dataHandle);
myLaunchInfo[currentLaunch].launchBlock.launchAppParameters =
(AppParametersPtr)*(launchDesc.dataHandle);
}
In article <lrucker-100494113729@leeann-mac.parcplace.com> Lee Ann
Rucker, lrucker@parcplace.com writes:
>| In article <lrucker-080494160935@leeann-mac.parcplace.com>
>lrucker@parcplace.com (Lee Ann Rucker) writes:
>| >
>| > I'm using them in an MPW tool to run applications, but I'd like to be
>able
>| > to specify a file for the app to open. IM:Processes says that the
>| > AppParameters struct can be used for sending an AppleEvent, but
doesn't
>| > explain how to set it up. Could anyone provide sample code to do
this?
+++++++++++++++++++++++++++
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Date: Wed, 13 Apr 1994 18:56:15 GMT
Organization: Apple Computer
Gary Kacmarcik, platypus@cirrus.som.cwru.edu writes:
> why isn't it acceptable to send an 'odoc' event after the app is opened?
Because then the app will get an 'oapp' followed by an 'odoc'. For most
document type apps this will cause a spurious untitled window to open; for
things like drop-boxes they may just quit immediately upon getting the 'oapp'.
Lee Ann, you might want to look at my SignatureToApp library, available on
the developer CD (or the 'develop' CD too, I think.) It's a C library that
lets you launch applications with documents. It includes a simple MPW tool
for launching apps; I don't remember if the tool accepts documents or not,
but it shouldn't be hard to extend it to do so.
--Jens Alfke
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
---------------------------
>From rjc@terminator.rs.itd.umich.edu (Robert John Churchill)
Subject: System 7 Menu on right side of menubar
Date: 4 Apr 1994 19:13:13 -0400
Organization: University of Michigan
I'm interested in putting up a menu on the right side of the
menubar, much like the Balloon help and Application menus.
Who knows how to do this? (I saw this information posted a
while ago but didn't retain it.) Thanks!
Robert
rjc@umich.edu
+++++++++++++++++++++++++++
>From gurgle@netcom.com (Pete Gontier)
Date: Wed, 6 Apr 1994 18:42:39 GMT
Organization: cellular
rjc@terminator.rs.itd.umich.edu (Robert John Churchill) writes:
>I'm interested in putting up a menu on the right side of the menubar,
>much like the Balloon help and Application menus. Who knows how to do
>this? (I saw this information posted a while ago but didn't retain it.)
>Thanks!
Eventually I will be releasing an API to do this. It's a lot less
trivial to do safely than you might think. There's a way to put an
icon suite in a menu title, and there's an ID range to use, and if you
really want your menu to behave like one of the system menus, you have
to insert your menu at the right time. All three of these things are
separate issues and all three rely on undocumented info. And that's why
I'll be releasing an API. Look for it soon in a theater near you.
--
Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com
+++++++++++++++++++++++++++
>From Alexander M. Rosenberg <alexr@apple.com>
Date: Thu, 7 Apr 1994 01:28:38 GMT
Organization: Hackers Anonymous
In article <gurgleCnupB4.GEw@netcom.com> Pete Gontier, gurgle@netcom.com
writes:
> rjc@terminator.rs.itd.umich.edu (Robert John Churchill) writes:
>
> >I'm interested in putting up a menu on the right side of the menubar,
> >much like the Balloon help and Application menus. Who knows how to do
> >this? (I saw this information posted a while ago but didn't retain it.)
> >Thanks!
>
> Eventually I will be releasing an API to do this. It's a lot less
> trivial to do safely than you might think. There's a way to put an
> icon suite in a menu title, and there's an ID range to use, and if you
> really want your menu to behave like one of the system menus, you have
> to insert your menu at the right time. All three of these things are
> separate issues and all three rely on undocumented info. And that's why
> I'll be releasing an API. Look for it soon in a theater near you.
This menu ID range is reserved for use by Apple Computer, per page I-109 of
Inside Macintosh, Volume 1 and on page 1-47 of Inside Macintosh: More
Macintosh Toolbox. Both places specifically say "do not use."
So, how will your "API" serve to somehow magically make using undocumented
(and "do not use") things acceptable?
- -------------------------------------------------------------------------
- Alexander M. Rosenberg - INTERNET: alexr@apple.com - Yoyodyne -
- 330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr - Propulsion -
- Palo Alto, CA 94301 - - Systems -
- (415) 329-8463 - Nobody is my employer so - :-) -
- - nobody cares what I say. - -
+++++++++++++++++++++++++++
>From jbrowne@zaphod.ncsa.uiuc.edu (Jim Browne)
Date: 7 Apr 94 19:33:28 GMT
Organization: University of Illinois at Urbana
Alexander M. Rosenberg <alexr@apple.com> writes:
>So, how will your "API" serve to somehow magically make using undocumented
>(and "do not use") things acceptable?
I imagine the API will have checks of the system software version, etc. so it
can put up a big honkin' "This may not work with your system software, we
we're puds and used undocumented features. Apple told us not to, but we
did it anyway." dialog if the proper hooks aren't available.
*or*
They could just get Microsoft to use it in all of their products. Then Apple
engineers will do triple back flips to keep it working in the future.
(I wish people doing these undocumented whatevers would include a statement
at the bottom of their posts stating "This will break in the future." so
Apple people wouldn't have to spend thier time reminding us.)
--
Jim Browne | jbrowne@ncsa.uiuc.edu |
Head NCSA Mac Telnet Hacker, SDG System Administrator | (217) 244-7798 |
<a href="http://www.ncsa.uiuc.edu/SDG/People/jbrowne/jbrowne.html">Click me</a>
"People can buy HANDGUNS easier." - S. Anichini, on accquiring IMSA yearbooks.
+++++++++++++++++++++++++++
>From gurgle@netcom.com (Pete Gontier)
Date: Fri, 8 Apr 1994 07:24:17 GMT
Organization: cellular
Alexander M. Rosenberg <alexr@apple.com> writes:
>This menu ID range is reserved for use by Apple Computer, per page
>I-109 of Inside Macintosh, Volume 1 and on page 1-47 of Inside
>Macintosh: More Macintosh Toolbox. Both places specifically say "do not
>use." So, how will your "API" serve to somehow magically make using
>undocumented (and "do not use") things acceptable?
It won't. It will, however, buy you a couple of other things:
1) You won't have to reverse-engineer the information yourself.
2) Presumably if it breaks I can fix it without your having to
change your program.
It's not as if I'm going to claim in the documentation that the thing
is risk-free. However, it *is* better than having 17 people do it 17
different ways.
Now calm down. I give you permission to break it into itty bitty pieces
if you should be in a position to do so. Have fun.
--
Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com
+++++++++++++++++++++++++++
>From Alexander M. Rosenberg <alexr@apple.com>
Date: Tue, 12 Apr 1994 10:39:58 GMT
Organization: Hackers Anonymous
In article <2nq6u9$ivm@terminator.rs.itd.umich.edu> Robert John Churchill,
rjc@terminator.rs.itd.umich.edu writes:
> I'm interested in putting up a menu on the right side of the
> menubar, much like the Balloon help and Application menus.
> Who knows how to do this? (I saw this information posted a
> while ago but didn't retain it.) Thanks!
You can't. Apple does not support the creation of "System Menus" by
third-party applications developers.
Re-read the "Toolbox Karma" technote if you have any questions.
- -------------------------------------------------------------------------
- Alexander M. Rosenberg - INTERNET: alexr@apple.com - Yoyodyne -
- 330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr - Propulsion -
- Palo Alto, CA 94301 - - Systems -
- (415) 329-8463 - Nobody is my employer so - :-) -
- - nobody cares what I say. - -
+++++++++++++++++++++++++++
>From zobkiw@datawatch.com (joe zobkiw)
Date: Wed, 13 Apr 1994 12:31:24 GMT
Organization: Datawatch Corporation
In article <1994Apr12.103958.979@gallant.apple.com>, Alexander M. Rosenberg
<alexr@apple.com> wrote:
> In article <2nq6u9$ivm@terminator.rs.itd.umich.edu> Robert John Churchill,
> rjc@terminator.rs.itd.umich.edu writes:
> > I'm interested in putting up a menu on the right side of the
> > menubar, much like the Balloon help and Application menus.
> > Who knows how to do this? (I saw this information posted a
> > while ago but didn't retain it.) Thanks!
>
> You can't. Apple does not support the creation of "System Menus" by
> third-party applications developers.
>
Apple might not support it...but...if you can get Microsoft to do it then
I'll betcha it'll never break in the future. :) There are numerous ways to
do this...but the important part of one way is...
- The menu IDs must be within a specific range. Start at -18321 and
increase (add to) this value until you find a blank space.
- IM-Text will show you how to put an icon as the title of the menu.
- Patch GetMenu, when it is called inserting the Balloon Help menu you can
insert your own menu first. Make sure you don't step on any other menu ids,
including the Balloon Help menu id.
- Patch MenuSelect to set up your menu items with the proper checkmarks,
disabled states, etc...
- Patch SystemMenu to get selections from your menu.
This works for a hack I wrote and has yet to break since 7.0. I also know
for a fact that this mechanism is used in numerous popular shareware and a
few commercial products.
___________________________________________________________
_/_/_/_/ Joe Zobkiw ,,,
_/ Senior Software Engineer - -
_/ Datawatch Corporation L
_/_/_/_/ zobkiw@datawatch.com -
---------------------------
>From Joshua Joseph Marks <jmb1+@andrew.cmu.edu>
Subject: free vs. DisposPtr??
Date: Mon, 4 Apr 1994 01:48:44 -0400
Organization: Junior, Math/Computer Science, Carnegie Mellon, Pittsburgh, PA
Being new to the mac game I'm still frustrated by the Mac included vs
ASCI ways of handling memory. If I use NewPtr to allocate a given
structure, should I use DisposPtr to deallocate it? Im using THINK C
6.0 and when I use DisposPtr nothing seems to happen. I call it:
some_struct *my_struct;
my_struct = (some_struct *) NewPtr (sizeof(some_struct));
DisposPtr ((Ptr) my_struct);
if I use the debugger and check out the value of *my_struct, what should I
see? Is this the right way to go about things?
+++++++++++++++++++++++++++
>From fixer@faxcsl.dcrt.nih.gov (Chris Gonna' Find Ray Charles Tate)
Date: Mon, 4 Apr 1994 13:43:27 GMT
Organization: DCRT, NIH, Bethesda, MD
In article <Ehbucwm00WBNE7_2FN@andrew.cmu.edu>, Joshua Joseph Marks <jmb1+@andrew.cmu.edu> writes:
>
>Being new to the mac game I'm still frustrated by the Mac included vs
>ASCI ways of handling memory. If I use NewPtr to allocate a given
>structure, should I use DisposPtr to deallocate it? Im using THINK C
>6.0 and when I use DisposPtr nothing seems to happen. I call it:
>
> some_struct *my_struct;
>
> my_struct = (some_struct *) NewPtr (sizeof(some_struct));
> DisposPtr ((Ptr) my_struct);
>
> if I use the debugger and check out the value of *my_struct, what should I
> see? Is this the right way to go about things?
You shouldn't see anything. You haven't *changed* the block pointed to
by my_struct; you've just told the OS to consider that chunk of memory as
available.
NewPtr() is *exactly* like malloc(), and DisposePtr() is *exactly* like
free(), for most purposes. Just as you must use free() to deallocate a
block obtained from malloc(), you must use DisposePtr() to deallocate a
block that you got via NewPtr().
In general, you oughtn't mix malloc() allocation with NewPtr() allocation;
they work differently (malloc() isn't part of the OS!), and so you can get
memory fragmentation problems if you mix them. I personally never use
malloc(); if I have to port something large that uses it, I just use
#define malloc(x) NewPtr(x) to override it, or do a global search-and-
replace.
The actual mechanisms of how allocation is handled, as far as the programmer
is concerned, is just like the ANSI-defined library functions.
- -------------------------------------------------------------------
Christopher Tate | "Blue ice cubes? How degenerate!"
MSD, Inc. |
fixer@faxcsl.dcrt.nih.gov | < anybody recognize the source? >
+++++++++++++++++++++++++++
>From scott.m.silver@dartmouth.edu (Scott M. Silver)
Date: 4 Apr 1994 15:08:21 GMT
Organization: Dartmouth College - Hanover, NH
In article <1994Apr4.134327.2777@alw.nih.gov>
fixer@faxcsl.dcrt.nih.gov (Chris Gonna' Find Ray Charles Tate) writes:
> In general, you oughtn't mix malloc() allocation with NewPtr() allocation;
> they work differently (malloc() isn't part of the OS!), and so you can get
> memory fragmentation problems if you mix them. I personally never use
> malloc(); if I have to port something large that uses it, I just use
> #define malloc(x) NewPtr(x) to override it, or do a global search-and-
> replace.
Be very careful not to use a NewPtr() call and then use a free() to
dispose it. Like Chris said, malloc is considered a private
implementation, and free is simply its complement. Although you still
can get memory fragmentation problems when using either NewPtr or
malloc.
To summarize:
NewPtr begat DisposePtr
malloc begat free
Scott
____________________________________________________________________
Scott Silver Dartmouth College Hanover, NH
+++++++++++++++++++++++++++
>From dsquirre@reed.edu (Douglas Squirrel)
Date: 5 Apr 1994 08:39:08 GMT
Organization: Reed College, Portland, Oregon
>NewPtr() is *exactly* like malloc(), and DisposePtr() is *exactly* like
>free(), for most purposes.
1. How *does* NewPtr() work? Does it just do a NewHandle() and then HLock()
it, and if so, doesn't this cause heap problems?
2. When is NewPtr() *not* exactly like malloc()?
I don't pretend to understand memory management on the Mac, so non-technical
replies would be appreciated.
--dsquirre@reed.edu
+++++++++++++++++++++++++++
>From fixer@faxcsl.dcrt.nih.gov (Chris Gonna' Find Ray Charles Tate)
Date: Tue, 5 Apr 1994 13:28:10 GMT
Organization: DCRT, NIH, Bethesda, MD
In article <2nr83c$3cc@scratchy.reed.edu>, dsquirre@reed.edu (Douglas Squirrel) writes:
> Chris Tate wrote:
>
>> NewPtr() is *exactly* like malloc(), and DisposePtr() is *exactly* like
>> free(), for most purposes.
>
>1. How *does* NewPtr() work? Does it just do a NewHandle() and then HLock()
> it, and if so, doesn't this cause heap problems?
>
>2. When is NewPtr() *not* exactly like malloc()?
NewPtr() is the native OS routine for allocating a block of memory. It
finds a block of the appropriate size, marks it internally as being
"allocated," and returns a pointer to it for the program to use. It
doesn't go through NewHandle().
malloc() and NewPtr() are different in that NewPtr() directly calls the OS's
memory management. In particular, the OS keeps track of what parts of
memory are allocated or not. malloc(), on the other hand, is a library
routine. This means that the compiler writers created their own set of
routines for determining what memory is to be considered "allocated" or
not.
In its simplest form, malloc() could simply call NewPtr() directly, and
that would be that. However, under many implementations of the C libraries,
malloc() works differently. Under THINK C, for example, malloc() allocates
"chunks" much larger than your requested allocation, and manages "sub-blocks"
within those chunks itself. So, if you malloc() three smallish objects,
you might actually find yourself with three pointers, all of which point
somewhere inside a single "chunk" that the malloc() library obtained from
the OS by calling NewPtr().
Practically speaking, the major issue that differs between using NewPtr()
and using malloc() is that with some compilers, when you use malloc(),
you can never actually reclaim *all* of the space you allocate. The
library may not give the "chunks" back to the OS. You can still malloc()
memory out of them (since the malloc() library still knows about them),
but the rest of the OS will never be able to access that memory.
Sometimes malloc() can be better; in particular, this "chunk"-based
mechanism, in which malloc() does its own free-block tracking, can be
rather faster than NewPtr(). But, as I said, it does have its drawbacks
as well.
- -------------------------------------------------------------------
Christopher Tate | "Blue ice cubes? How degenerate!"
MSD, Inc. |
fixer@faxcsl.dcrt.nih.gov | < anybody recognize the source? >
+++++++++++++++++++++++++++
>From jwbaxter@olympus.net (John W. Baxter)
Date: Tue, 05 Apr 1994 08:25:59 -0700
Organization: Internet for the Olympic Peninsula
In article <2nr83c$3cc@scratchy.reed.edu>, dsquirre@reed.edu (Douglas
Squirrel) wrote:
> 1. How *does* NewPtr() work? Does it just do a NewHandle() and then HLock()
> it, and if so, doesn't this cause heap problems?
No...NewPtr () works quite hard to position the newly-allocated block as
low in the heap as possible, shoving relocatable blocks upwards to
accomplish that. [You should have as few locked handles in arbitrary
locations about the heap as possible before calling NewPtr (), or proper
placement of the new non-relocatable block may not be possible.]
If the block you allocate is never going to move, use NewPtr (). If it's
going to be relocatable but locked for longish periods, it's best (but not
ideal) to move it high on the heap before locking it. Other locks should
be left in place for the shortest rational periods you can.
The above is all well described in Inside Macintosh: Memory. The
relationship with malloc () and free () isn't, since that's up to the
compiler implementors, who should do an equally good job of describing
their implementation.
--
John Baxter Port Ludlow, WA, USA [West shore, Puget Sound]
jwbaxter@pt.olympus.net
+++++++++++++++++++++++++++
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Date: Thu, 7 Apr 1994 19:24:26 GMT
Organization: Apple Computer
fixer@faxcsl.dcrt.nih.gov (Chris Gonna' Find Ray Charles Tate) writes:
> In general, you oughtn't mix malloc() allocation with NewPtr() allocation;
> they work differently (malloc() isn't part of the OS!), and so you can get
> memory fragmentation problems if you mix them. I personally never use
> malloc(); if I have to port something large that uses it, I just use
> #define malloc(x) NewPtr(x) to override it, or do a global search-and-
> replace.
BAD idea! All the Mac implementations of malloc that I've seen are much more
efficient than NewPtr, in that they usually don't make trap calls or move
memory. (They get memory from NewPtr in large chunks and then parcel out that
memory bit by bit on every malloc call.) Their algorithms are also simpler
and faster because they don't have to deal with relocatable blocks.
Malloc also reduces heap fragmentation in that memory returned by free is
kept inside a Mac memory manager block until it's re-used by malloc, so the
MM doesn't try anything dumb like allocating a handle inside the unused space.
If you have stuff with both malloc and NewPtr calls I'd suggest replacing
NewPtr with malloc, not the other way 'round.
--Jens Alfke
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
+++++++++++++++++++++++++++
>From fixer@faxcsl.dcrt.nih.gov (Chris Gonna' Find Ray Charles Tate)
Date: Fri, 8 Apr 1994 11:50:19 GMT
Organization: DCRT, NIH, Bethesda, MD
In article <1994Apr7.192426.5155@gallant.apple.com>, Jens Alfke <jens_alfke@powertalk.apple.com> writes:
>fixer@faxcsl.dcrt.nih.gov (Chris Gonna' Find Ray Charles Tate) writes:
>> In general, you oughtn't mix malloc() allocation with NewPtr() allocation;
>> they work differently (malloc() isn't part of the OS!), and so you can get
>> memory fragmentation problems if you mix them. I personally never use
>> malloc(); if I have to port something large that uses it, I just use
>> #define malloc(x) NewPtr(x) to override it, or do a global search-and-
>> replace.
>
>BAD idea! All the Mac implementations of malloc that I've seen are much more
>efficient than NewPtr, in that they usually don't make trap calls or move
>memory. (They get memory from NewPtr in large chunks and then parcel out that
>memory bit by bit on every malloc call.) Their algorithms are also simpler
>and faster because they don't have to deal with relocatable blocks.
Except that you can *never* recover memory allocated via malloc(), at least
under THINK C. It's permanently part of the malloc() pool. Also, malloc()
won't allocate pools of more than a certain size, and so anything bigger
than that will be allocated via a native NewPtr() call. Fragmentation
in this case is just like using NewPtr() exclusively - actually worse,
since the permanent malloc() pools get in the way.
I would probably recommend thus: if most of the memory allocation
you do is via malloc() (i.e. is not done for use by the OS), then it's
probably better to go ahead and use the library malloc() function.
However, if you need to allocate OS-style memory in large part as well,
you will probably make fragmentation worse by using malloc() instead
of only NewPtr().
Offhand, I can think of a couple of ways to improve the library malloc().
One is to deallocate empty pools (which would avoid the problem of having
residual blocks permanently mucking up the heap). Another might be to
have the pools allocated as *handles*, and locked whenever there is an
allocated sub-block. When the last sub-block in the pool is free()'d,
unlock the pool handle and let it float until another allocation is
needed (then maybe move it high? all sorts of possibilities here...).
- -------------------------------------------------------------------
Christopher Tate | "Blue ice cubes? How degenerate!"
MSD, Inc. |
fixer@faxcsl.dcrt.nih.gov | < anybody recognize the source? >
+++++++++++++++++++++++++++
>From dsquirre@reed.edu (Douglas Squirrel)
Date: 9 Apr 1994 09:52:19 GMT
Organization: Reed College, Portland, Oregon
I tried changing all my mallocs to NewPtrs and frees to DisposPtrs.
And my application runs ten times slower!!!
It is a fairly simple text viewer, with the text represented as a linked list
of lines terminated by newlines. So it dynamically allocates space for each
line as it reads it from the disk.
Why did this happen?
--dsquirre@reed.edu
+++++++++++++++++++++++++++
>From Reid Ellis <rae@alias.com>
Date: Wed, 13 Apr 1994 04:04:26 GMT
Organization: Alias Research, Inc., Toronto ON Canada
Douglas Squirrel <dsquirre@reed.edu> writes:
|I tried changing all my mallocs to NewPtrs and frees to DisposPtrs.
|
|And my application runs ten times slower!!!
[...]
|Why did this happen?
Because malloc() and free() were optimizing memory allocation for you.
NewPtr() and DisposPtr() are notoriously slow [on 68k Macintoshes].
This is one reason there is a "Modern Memory Manager" on the
PowerPC's.
Reid
--
- -
Reid Ellis, Alias Research Inc.
+1 416 362 9181 <rae@Alias.com>
---------------------------
End of C.S.M.P. Digest
**********************